/*
 * Copyright (C) 2017 zhouyou(478319399@qq.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.shuyihui.rxhttp.callback

import com.google.gson.internal.`$Gson$Types`
import com.shuyihui.rxhttp.cache.model.CacheResult
import com.shuyihui.rxhttp.model.ApiResult
import com.shuyihui.rxhttp.utils.Utils
import okhttp3.ResponseBody
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

/**
 *
 * 描述：提供回调代理
 * 主要用于可以自定义ApiResult<br></br>
 */
abstract class CallBackProxy<T : ApiResult<R>?, R>(
    var mCallBack: CallBack<R>?
) : IType<T> {
    val callBack: CallBack<R>?
        get() = mCallBack//如果用户的信息是返回List需单独处理

    //CallBack代理方式，获取需要解析的Type
    override val type: Type
        get() { //CallBack代理方式，获取需要解析的Type
            var typeArguments: Type? = null
            mCallBack?.apply {
                val rawType = this.rawType //如果用户的信息是返回List需单独处理
                typeArguments = if (MutableList::class.java.isAssignableFrom(
                        Utils.getClass(
                            rawType,
                            0
                        )
                    ) || MutableMap::class.java.isAssignableFrom(
                        Utils.getClass(rawType, 0)
                    )
                ) {
                    this.type
                } else if (CacheResult::class.java.isAssignableFrom(Utils.getClass(rawType, 0))) {
                    val type = this.type
                    Utils.getParameterizedType(type, 0)
                } else {
                    val type = this.type
                    Utils.getClass(type, 0)
                }
            }
            /*if (mCallBack != null) {
                val rawType = mCallBack.rawType //如果用户的信息是返回List需单独处理
                typeArguments = if (MutableList::class.java.isAssignableFrom(
                        Utils.getClass(
                            rawType,
                            0
                        )
                    ) || MutableMap::class.java.isAssignableFrom(
                        Utils.getClass(rawType, 0)
                    )
                ) {
                    mCallBack.type
                } else if (CacheResult::class.java.isAssignableFrom(Utils.getClass(rawType, 0))) {
                    val type = mCallBack.type
                    Utils.getParameterizedType(type, 0)
                } else {
                    val type = mCallBack.type
                    Utils.getClass(type, 0)
                }
            }*/
            if (typeArguments == null) {
                typeArguments = ResponseBody::class.java
            }
            var rawType = Utils.findNeedType(javaClass)
            if (rawType is ParameterizedType) {
                rawType = rawType.rawType
            }
            return `$Gson$Types`.newParameterizedTypeWithOwner(null, rawType, typeArguments)
        }
}